//
//  ZMPerson.m
//  demo
//
//  Created by chenzm on 2018/8/17.
//  Copyright © 2018年 chenzm. All rights reserved.
//

#import "ZMPerson.h"
#import <objc/runtime.h>
@interface ZMPerson(){
    NSString *mobile;//手机号
}

/** 年龄 **/
@property (nonatomic, copy) NSString *age;

@end

@implementation ZMPerson{
    NSString *address;//地址
}

- (NSString *)coding {
    return @"😋😋😋coding";
}

- (NSString *)eating {
    return @"eating";
}

- (NSString *)changeMethod {
    return @"方法已被拦截并替换";
}

// void(*)()
// 默认方法都有两个隐式参数，
void eat(id self, SEL _cmd, NSNumber *meter){
    NSLog(@"%@ __ %@ __ %@",[self class],NSStringFromSelector(_cmd),meter);
}

// 当一个对象调用未实现的方法，会调用这个方法处理,并且会把对应的方法列表传过来.
// 刚好可以用来判断，未实现的方法是不是我们想要动态添加的方法
+ (BOOL)resolveInstanceMethod:(SEL)sel{
    NSString *selStr = @"eat:";
    SEL selFromStr = NSSelectorFromString(selStr);
    if (sel == selFromStr) {
        // 动态添加eat方法
        // 第一个参数：给哪个类添加方法
        // 第二个参数：添加方法的方法编号
        // 第三个参数：添加方法的函数实现（函数地址）
        // 第四个参数：函数的类型，(返回值+参数类型) v:void @:对象->self :表示SEL->_cmd
        class_addMethod(self, sel, (IMP)eat, "v@:@");
    }
    return [super resolveInstanceMethod:sel];
}

@end
